#include "postac.h"
#include <iostream>


/* WYLACZYLEM CI W RYSOWANIE NA BUFFORZE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/



postac::postac(long volatile* TimerSpeed)  // konstruktor
{
	ikony=new BITMAP*[ilosc_bmp];
	for(int p=0;p<ilosc_bmp;++p)
		ikony[p]=NULL;
	klatka=0;
	pozycja_x=70;
	pozycja_y=50;

	bufor = create_bitmap(800,600);


	sptimer=TimerSpeed;
	if (!bufor){
		set_gfx_mode(GFX_TEXT,rozdzielczoscX,rozdzielczoscY,0,0);
		allegro_message("Nie mogę utworzyć bufora !");
		allegro_exit();
	}

}

postac::~postac()
{
	for(int p=0;p<ilosc_bmp;++p)
		destroy_bitmap(ikony[p]);

	destroy_bitmap(bufor);




}
//*************************************************
void pozycjaWtablicy(int x,int y){






}
//*************************************************
void postac::KtoraKlatka(volatile long sptimer){

	int frame=(sptimer%50);

		if(frame < 10) klatka=0;
		else{
			if(frame < 20) klatka=1;
			else{
				if( frame < 30) klatka=2;
				else{
					if( frame <40) klatka =3;

					else
						klatka =4;
				}
			}
		}
	}
//*************************************************
bool postac::zaladuj_bitmapy(const char* plik1,const char* plik2,const char* plik3,const char* plik4,const char* plik5){

	ikony[0]=load_bitmap(plik1,default_palette);
	if(ikony[0]==NULL) return false;

	ikony[1]=load_bitmap(plik2,default_palette);
	if(ikony[1]==NULL) return false;

	ikony[2]=load_bitmap(plik3,default_palette);
	if(ikony[2]==NULL) return false;

	ikony[3]=load_bitmap(plik4,default_palette);
	if(ikony[3]==NULL) return false;

	ikony[4]=load_bitmap(plik5,default_palette);
	if(ikony[4]==NULL) return false;

return true;
}
//*************************************************
BITMAP* postac::pokaz(int indeks){

	 return ikony[indeks];
}
//*************************************************
void postac::rysuj(BITMAP* buffor){

	KtoraKlatka(*sptimer);

	switch(klatka){
    case 0:masked_blit(ikony[0],bufor,0,0,pozycja_x,pozycja_y,ikony[0]->w,ikony[0]->h); break;

	case 1:masked_blit(ikony[1],bufor,0,0,pozycja_x,pozycja_y,ikony[1]->w,ikony[1]->h); break;

	case 2:masked_blit(ikony[2],bufor,0,0,pozycja_x,pozycja_y,ikony[2]->w,ikony[2]->h); break;

	case 3:masked_blit(ikony[3],bufor,0,0,pozycja_x,pozycja_y,ikony[3]->w,ikony[3]->h); break;

	case 4:masked_blit(ikony[4],bufor,0,0,pozycja_x,pozycja_y,ikony[4]->w,ikony[4]->h); break;


	}
	show_mouse(buffor);
		masked_blit(bufor,screen,0,0,0,0,800,600);
		show_mouse(screen);


/* tu nie masz wyswietlenia buffora celowo ?????????????????????????? */

}

//**************************************************
void postac::rysuj(int frame){

	KtoraKlatka(frame);
    clear_to_color(bufor, makecol(255, 255, 255));
	switch(klatka){

	case 0:masked_blit(ikony[0],bufor,0,0,pozycja_x,pozycja_y,ikony[0]->w,ikony[0]->h); break;

	case 1:masked_blit(ikony[1],bufor,0,0,pozycja_x,pozycja_y,ikony[1]->w,ikony[1]->h); break;

	case 2:masked_blit(ikony[2],bufor,0,0,pozycja_x,pozycja_y,ikony[2]->w,ikony[2]->h); break;

	case 3:masked_blit(ikony[3],bufor,0,0,pozycja_x,pozycja_y,ikony[3]->w,ikony[3]->h); break;

	case 4:masked_blit(ikony[4],bufor,0,0,pozycja_x,pozycja_y,ikony[4]->w,ikony[4]->h); break;


	}
	show_mouse(bufor);
	masked_blit(bufor,screen,0,0,0,0,800,600);
	show_mouse(screen);

}
////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//******************************************TU MASZ ZMIENIONE**********************************************
void postac::rysuj(bool flag,int bmp){


    clear_to_color(bufor, makecol(255, 255, 255));
    switch(bmp){

	case 0:masked_blit(ikony[0],bufor,0,0,pozycja_x,pozycja_y,ikony[0]->w,ikony[0]->h); break;

	case 1:masked_blit(ikony[1],bufor,0,0,pozycja_x,pozycja_y,ikony[1]->w,ikony[1]->h); break;

	case 2:masked_blit(ikony[2],bufor,0,0,pozycja_x,pozycja_y,ikony[2]->w,ikony[2]->h); break;

	case 3:masked_blit(ikony[3],bufor,0,0,pozycja_x,pozycja_y,ikony[3]->w,ikony[3]->h); break;

	case 4:masked_blit(ikony[4],bufor,0,0,pozycja_x,pozycja_y,ikony[4]->w,ikony[4]->h); break;


	}
	show_mouse(bufor);
	masked_blit(bufor,screen,0,0,0,0,800,600);
	show_mouse(screen);

}
//******************************************
void postac::rysuj(bool flag,int bmp,BITMAP* bufor){

      scare_mouse();
    BITMAP* pom=create_bitmap(1024,768);
    blit(bufor,pom,0,0,0,0,1024,768);
	switch(bmp){

	case 0:masked_blit(ikony[0],pom,0,0,pozycja_x,pozycja_y,ikony[0]->w,ikony[0]->h); break;

	case 1:masked_blit(ikony[1],pom,0,0,pozycja_x,pozycja_y,ikony[1]->w,ikony[1]->h); break;

	case 2:masked_blit(ikony[2],pom,0,0,pozycja_x,pozycja_y,ikony[2]->w,ikony[2]->h); break;

	case 3:masked_blit(ikony[3],pom,0,0,pozycja_x,pozycja_y,ikony[3]->w,ikony[3]->h); break;

	case 4:masked_blit(ikony[4],pom,0,0,pozycja_x,pozycja_y,ikony[4]->w,ikony[4]->h); break;


	}

	blit(pom,screen,0,0,0,0,800,600);
	destroy_bitmap(pom);
	show_mouse(screen);

}
//************************************************
void postac::RuchDyskretny(int x,int y,volatile long& opuznienie,BITMAP* main_bufor){
int pomX=pozycja_x; // zmiene pomocnicze do przechowywanie pozycjy z której zaczyna się ruch
int pomY=pozycja_y; // zmiene pomocnicze do przechowywanie pozycjy z której zaczyna się ruch
int op=4;

int frame=0;  // wykorzystywana do rysowania na przeminenego dwóch bitmap.



	if (pozycja_y+odstep_od_krawedzi_pola_z_prawej < y && y < rozmiar_X_tablicy_w_px){
	// sprawdzamy czy kliniety obszar nalezacy do pola poniżej połozenia postaci

		while(pozycja_y != pomY+bok_pola){
		// przesuwamy postac do momentu przejscia jej na srodek nastepnego pola.
			if(opuznienie % 2==0) pozycja_y++;


			if(opuznienie % op==0){

				if(frame==0)
					frame=1;
				else
					frame=0;
			}
			rysuj(0,frame,main_bufor);

		}
	}
	else{
			if(pozycja_y-odstep_od_krawedzi_pola_z_lewej > y && y > odstep_od_krawedzi_pola_z_lewej){

				while(pozycja_y!=pomY-bok_pola){

					if(opuznienie % 2==0) pozycja_y--;

					if(opuznienie % op==0){

						if(frame==1)
							frame=2;
						else
							frame=1;
					}
					rysuj(0,frame,main_bufor);
				}
			}
		else{
			if (pozycja_x+odstep_od_krawedzi_pola_z_prawej < x && x < rozmiar_Y_tablicy_w_px){

			while(pozycja_x!=pomX+bok_pola){

				if(opuznienie % 2==0) pozycja_x++;

				if(opuznienie % op==0){

					if(frame==2)
						frame=3;
					else
						frame=2;
				}
				rysuj(0,frame,main_bufor);

			}
		}
			else{
				if(pozycja_x-odstep_od_krawedzi_pola_z_lewej > x && x > odstep_od_krawedzi_pola_z_lewej){

					while(pozycja_x!=pomX-bok_pola){

						if(opuznienie % 2==0) pozycja_x--;

						if(opuznienie % op==0){

							if(frame==3)
								frame=4;
							else
								frame=3;
							}
						rysuj(0,frame,main_bufor);

					}

				}
			}
		}
	}
}
void postac::RuchDyskretny(volatile long& opuznienie,BITMAP* buffor){

int x=mouse_x;
int y=mouse_y;
int pomX=pozycja_x; // zmiene pomocnicze do przechowywanie pozycjy z której zaczyna się ruch
int pomY=pozycja_y; // zmiene pomocnicze do przechowywanie pozycjy z której zaczyna się ruch
int op=4;

int frame=0;  // wykorzystywana do rysowania na przeminenego dwóch bitmap.



	if (pozycja_y+odstep_od_krawedzi_pola_z_prawej < y && y < rozmiar_X_tablicy_w_px){
	// sprawdzamy czy kliniety obszar nalezacy do pola poniżej połozenia postaci

		while(pozycja_y != pomY+bok_pola){
		// przesuwamy postac do momentu przejscia jej na srodek nastepnego pola.
			if(opuznienie % 2==0) pozycja_y++;


			if(opuznienie % op==0){

				if(frame==0)
					frame=1;
				else
					frame=0;
			}
			rysuj(0,frame);

		}
	}
	else{
			if(pozycja_y-odstep_od_krawedzi_pola_z_lewej > y && y > odstep_od_krawedzi_pola_z_lewej){

				while(pozycja_y!=pomY-bok_pola){

					if(opuznienie % 2==0) pozycja_y--;

					if(opuznienie % op==0){

						if(frame==1)
							frame=2;
						else
							frame=1;
					}
					rysuj(0,frame);
				}
			}
		else{
			if (pozycja_x+odstep_od_krawedzi_pola_z_prawej < x && x < rozmiar_Y_tablicy_w_px){

			while(pozycja_x!=pomX+bok_pola){

				if(opuznienie % 2==0) pozycja_x++;

				if(opuznienie % op==0){

					if(frame==2)
						frame=3;
					else
						frame=2;
				}
				rysuj(0,frame);

			}
		}
			else{
				if(pozycja_x-odstep_od_krawedzi_pola_z_lewej > x && x > odstep_od_krawedzi_pola_z_lewej){

					while(pozycja_x!=pomX-bok_pola){

						if(opuznienie % 2==0) pozycja_x--;

						if(opuznienie % op==0){

							if(frame==3)
								frame=4;
							else
								frame=3;
							}
						rysuj(0,frame);

					}

				}
			}
		}
	}
}




//************************************************

void postac::ruch(int x,int y,int frame){
bool left_right=0;


	if( pozycja_x<x && pozycja_y<y){

		while( !(pozycja_x==x) || !(pozycja_y==y) ){

			if(!(pozycja_x==x)) pozycja_x++;

			if(!(pozycja_y==y)) pozycja_y++;


			if(left_right==0){
				rysuj(0,0);
				left_right=1;
			}
			else{
				rysuj(0,1);
				left_right=0;

			}

		}
	}
	if( pozycja_x>x && pozycja_y>y){
		while( !(pozycja_x==x) || !(pozycja_y==y) ){

			if(!(pozycja_x==x)) pozycja_x--;

			if(!(pozycja_y==y)) pozycja_y--;

						if(left_right==0){
				rysuj(0,1);
				left_right=1;
			}
			else{
				rysuj(0,2);
				left_right=0;
			}
		}
	}

	if( pozycja_x<x && pozycja_y>y){
		while( !(pozycja_x==x) || !(pozycja_y==y) ){

			if(!(pozycja_x==x)) pozycja_x++;

			if(!(pozycja_y==y)) pozycja_y--;

			if(left_right==0){
				rysuj(0,2);
				left_right=1;
			}
			else{
				rysuj(0,3);
				left_right=0;
			}
		}
	}
		if( pozycja_x>x && pozycja_y<y){
		while( !(pozycja_x==x) || !(pozycja_y==y) ){

			if(!(pozycja_x==x)) pozycja_x--;

			if(!(pozycja_y==y)) pozycja_y++;

			if(left_right==0){
				rysuj(0,3);
				left_right=1;
			}
			else{
				rysuj(0,4);
				left_right=0;
			}
		}
	}


}












//*************************************************
/*void postac::umiejetnosc_specjalna(){


}
*************************************************
void postac::zmiana_pol(){


}*/
